Python polymorphism explained